最近特殊时期开始的第一天(20200817),冰蝎的github项目就放出了加密Webshell管理的神器——冰蝎v3.0 Beta 1和2,给检测带来了更大的困难,普通的匹配字符串特征的检测已几乎不可能,下面简单分析一下。
这次最大的变化是去除了动态密钥协商机制,采用预共享密钥,全程无明文交互,密码的md5的前16位就是密钥
注:本文只针对当前的最新版冰蝎(Behinder) v3.0 Beta 2,并以PHP WebShell为例,其他的asp,jsp的也是类似的
实验环境
控制端:win10 + Behinder_v3.0 Beta 2
服务端:Ubuntu 16.04 + Apache + PHP 7.0.33
以shell.php为例的Webshell文件分析
1 | <?php |
可以看到,相比冰蝎(Behinder) v2.0.1,去除了动态密钥协商机制,直接写死了key,一个16位的key,这个key是密码的md5得来的。—— 冰蝎(Behinder) v2.0.1的分析可以参考: https://www.giantbranch.cn/2019/10/08/%E5%86%B0%E8%9D%8E%E5%8A%A8%E6%80%81%E4%BA%8C%E8%BF%9B%E5%88%B6%E5%8A%A0%E5%AF%86WebShell%E7%9A%84%E6%A3%80%E6%B5%8B/ )
1 | substr(md5(rebeyond)),0,16) == "e45e329feb5d925b" |
所以现在的通信示意图变成下面这样,直接用预设密钥进行加密通信
流量分析
通过抓取攻击流量,发现流量都是aes的加密结果
代码流程分析
注:通过在webshell中输出传输的明文,再base64解密即可获得下面列出的代码
首次连接
下面是点击打开webshell后,共执行了4个代码,后面两个是一样的,实际就算他3个吧
下面是第一个代码
1 | @error_reporting(0); |
可以看到传递给服务器的是一个类似UUID的字符串,之后在main中组装成数组后转为json,再使用AES进行加密(没有openssl才使用异或加密) ,最后输出出来,这一步的目的应该是看看服务器的加密结果是否与加密结果一样,这样既可以检测是否是冰蝎webshell,也可以检测webshell的密码是否正确
注意$content,即类似UUID的字符串(没意外就是UUID),是会变的,但是长度不变,也就是请求包的长度不变,加密后的结果的长度也是固定的,所以返回包的内容的长度也是固定的(php的http响应)
所以特征很明显:
1、第一个请求包的特征为 Content-Length: 1112 (这个长度是php的,jsp的是8940,aspx是7232,v3.0 Beta 2的asp版本的功能还是老版本的,所以asp版本暂无)
2、Header存在Pragma: no-cache
下面看第二个代码
1 | error_reporting(0); |
可以看到第二个代码获取了以下几个信息:
1、phpinfo的输出
2、driveList,windows就是看看有哪些磁盘,linux直接返回”/“
3、当前的路径
4、通过环境变量PHP_OS获取系统是windows还是linux什么的
最后看下最后一个代码
1 |
|
最后这两次代码是列出当前路径的文件
可以看到这个代码有以下功能:
1、列目录
2、获取文件内容
3、下载文件
4、删除文件
5、写入文件
6、向文件追加内容
7、重命名文件
命令执行
以id命令为例,可以看到跟v2.0是一样的,尝试用各种php执行命令的函数执行命令
1 | @error_reporting(0); |